#pragma comment(linker, "/STACK:10000000")
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <set>
#include <map>
#include <cstdio>
#include <cassert>
#include <string>
#include <cstring>
#define ldb double
#define LL long long
#define fi first
#define se second
#define fill(a, c) memset(a, c, sizeof(a))
#define sqr(a) ((a) * (a))
#define nextLine() {int c = 0; while((c = getchar()) != 10 && c != EOF);}
#define getBit(mask, k) (((mask) / pw[k]) % pw[1])
#define setBit(mask, k, l) (((mask) / pw[k + 1] * pw[1] + (l)) * pw[k] + ((mask) % pw[k]))
#define debug(a) cerr << #a << " = " << a << " ";
#define debugl(a) cerr << #a << " = " << a << "\n";
#define mp(a, b) make_pair(a, b)
#define pb(a) push_back(a)
#define ff first
#define ss second 
const ldb eps = 1e-9;
const int inf = 1 << 28;
const ldb pi = fabsl(atan2l(0.0, -1.0));
using namespace std;


int n, m, a, b;
int fst[25], nxt[25 * 25 * 2], end[25 * 25 * 2], edgs;
ldb p[25];
int g[25];
ldb t[22 * 22][22 * 22], B[22 * 22][22 * 22], A[22 * 22][22 * 22];

void addEdge(int i, int j)
{
	nxt[edgs] = fst[i];
	fst[i] = edgs;
	end[edgs] = j;
	edgs++;
}

void load()
{
	cin >> n >> m >> a >> b;
	memset(fst, -1, sizeof fst);
	int x, y;
	for (int i = 0; i < m; i++)
	{
		scanf("%d%d", &x, &y);
		g[x]++;
		g[y]++;
		addEdge(x, y);
		addEdge(y, x);
	}
	for (int i = 1; i <= n; i++)
	{
		cin >> p[i];
	}
}

inline int code(int i, int j)
{
	return (i - 1) * n + j - 1;
}

void gauss()
{
	ldb t;
	for (int i = 0; i < n * n; i++)
	{
		int j;
		for (j = 0; j < n * n && fabsl(A[i][j]) < eps; j++);
		if (j == n) continue;
		for (int k = 0; k < n * n; k++)
		{
			if (k == i || fabsl(A[k][j]) < eps) continue;
			t = A[k][j] / A[i][j];
			for (int l = 0; l < n * n; l++)
				A[k][l] -= A[i][l] * t;
		}
	}
	for (;;);
}

inline void setv(int i, int j, ldb v)
{
	A[i][j] = v;
}

void solve()
{
	for (int j = 1; j <= n; j++)
		{
			for (int k = 1; k <= n; k++)
			{
				if (j == k)
				{
					setv(code(j, k), code(j, k), 1);
					continue;
				}
				setv(code(j, k), code(j, k), p[j] * p[k]);
			    for (int l = fst[j]; l != -1; l = nxt[l])
			    {
			    	setv(code(j, k), code(end[l], k), (1. - p[j]) / g[j] * p[k]);
			    	for (int o = fst[k]; o != -1; o = nxt[o])
			    	{
			    		setv(code(j, k), code(end[l], end[o]), (1. - p[j]) / g[j] * (1. - p[k]) / g[k]);
			    		if (l == fst[j])
			    			setv(code(j, k), code(j, end[o]), (1. - p[k]) / g[k] * p[j]);
			    	}
			    }
			}
		}
	/*
	int p = 8000;
	int N = n * n;
	for (int i = 0; i < p; i++)
	{
		ldb s = 0;
		for (int j = 0; j < N; j++)
		{
			_v[j] = 0;
			for (int k = 0; k < N; k++)
				_v[j] += v[k] * A[j][k];
			if (_v[j] < 1e-20)
				_v[j] = 0;
			s += _v[j];
		}
		for (int j = 0; j < N; j++)
			v[j] = _v[j] / s;
	} */                 
	cerr << "po\n";
	int nn = n * n, p, j, k, l;
	ldb s;
	for (p = 0; p < 17; p++)
	{
		for (j = 0; j < nn; j++)
			for (k = 0; k < nn; k++)
			{
				t[j][k] = 0;
				for (l = 0; l < nn; l++)
					t[j][k] += A[j][l] * A[l][k];
			}
		for (j = 0; j < nn; j++)
		{
			s = 0;
			for (k = 0; k < nn; k++)
			{
				A[j][k] = t[j][k];
				if (A[j][k] < 1e-20) A[j][k] = 0;
				s += A[j][k];
			}
			for (k = 0; k < nn; k++) A[j][k] /= s;
		}                        	
	}
	
	cout << setprecision(10) << fixed;
	for (int i = 1; i <= n; i++)
	{
		cout << A[code(a, b)][code(i, i)] << " ";
	}
}

#define file "d"
int main()
{
	#ifndef ONLINE_JUDGE
		freopen(file".in", "rt", stdin);
		freopen(file".out", "wt", stdout);
	#endif
	load();
	solve();
	return 0;
}
